package 多线程;
/*
join()是 Thread 类中的一个方法，当我们需要让线程按照自己指定的顺序执行的时候，就可以利用这个方法。「Thread.join()方法表示调用此方法的线程被阻塞，仅当
该方法完成以后，才能继续运行」。

❝ 作用于 main( )主线程时，会等待其他线程结束后再结束主线程。
 */


public class 使用join {
	public static void main(String[] args) throws InterruptedException {
	/*	
	   //A线程和B线程是交替执行的
	   ThreadTest t1 = new ThreadTest("A");
		ThreadTest t2 = new ThreadTest("B");
		t1.start();
		t2.start();
	*/
	/*
	   //显然，使用t1.join()之后，B线程需要等A线程执行完毕之后才能执行。需要注意的是，t1.join()需要等t1.start()执行之后执行才有效果，此外，如果t1.join()放
	   //在t2.start()之后的话，仍然会是交替执行，然而并不是没有效果.
		ThreadTest t1=new ThreadTest("A");
		ThreadTest t2=new ThreadTest("B");
		t1.start();
		t1.join();
		t2.start();
	*/
	/*
		//A、B、C和主线程交替运行
		System.out.println(Thread.currentThread().getName()+" start");
		ThreadTest t1=new ThreadTest("A");
		ThreadTest t2=new ThreadTest("B");
		ThreadTest t3=new ThreadTest("C");
		System.out.println("t1start");
		t1.start();
		System.out.println("t2start");
		t2.start();
		System.out.println("t3start");
		t3.start();
		System.out.println(Thread.currentThread().getName()+" end");
	*/
		System.out.println(Thread.currentThread().getName()+" start");
		ThreadTest t1=new ThreadTest("A");
		ThreadTest t2=new ThreadTest("B");
		ThreadTest t3=new ThreadTest("C");
		System.out.println("t1start");
		t1.start();
		System.out.println("t1end");
		System.out.println("t2start");
		t2.start();
		System.out.println("t2end");
//		t2.join();
		System.out.println("t3start");
		t3.start();
		t3.join();
		System.out.println("t3end");
		System.out.println(Thread.currentThread().getName()+" end");
	}
}
/*
主线程在t1.join()方法处停止，并需要等待A线程执行完毕后才会执行t3.start()，然而，并不影响B线程的执行。因此，可以得出结论，t.join()方法只会
使主线程进入等待池并等待t线程执行完毕后才会被唤醒。并不影响同一时刻处在运行状态的其他线程。

	•t2一定在主线程main(即所在调用t2的线程)前结束；
	•不能保证在t2之前启动的线程之前或之后结束；
	•一定在t2之后启动的线程前结束。
	
 */


class ThreadTest extends Thread {
	private String name;

	public ThreadTest(String name) {
		this.name = name;
	}

	public void run() {
		for (int i = 1; i <= 35; i++) {
			System.out.println(name + "-" + i);
		}
	}
}
